/**
 * Promise 是异步编程的一种解决方案，比传统的解决方案——回调函数和事件——更合理和更强大。
 * Promise对象有以下两个特点：
 * （1）对象的状态不受外界影响。
 * （2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。
 * 
 * Promise三种状态：
 * pending（进行中）、fulfilled（已成功）和rejected（已失败）
 * 
 * Promise对象的状态改变：
 * 从pending变为fulfilled
 * 从pending变为rejected
 * 
 * 有了Promise对象，就可以将异步操作以同步操作的流程表达出来，避免了层层嵌套的回调函数。
 * 
 * 缺点：
 * 1.无法取消Promise；
 * 2.如果不设置回调函数，Promise内部抛出的错误，不会反应到外部；
 * 3.当处于pending状态时，无法得知目前进展到哪一个阶段
 * 
 * 
 * 语法：
 */
// const promise = new Promise(function(resolve, reject) {
//   // ... some code

//   if (/* 异步操作成功 */){
//     resolve(value);
//   } else {
//     reject(error);
//   }
// });

let promise = new Promise(function(resolve, reject) {
  console.log('Promise');
  resolve();
});

promise.then(function() {
  console.log('resolved.');
});

console.log('Hi!');

// Promise
// Hi!
// resolved

/**
 * Promise.prototype.then()，then方法是定义在原型对象Promise.prototype上的。
 * 它的作用是为 Promise 实例添加状态改变时的回调函数。
 * 
 * Promise.prototype.catch()， Promise.prototype.catch()方法是.then(null, rejection)
 * 或.then(undefined, rejection)的别名，用于指定发生错误时的回调函数。
 * 
 * Promise.prototype.finally()，用于指定不管 Promise 对象最后状态如何，都会执行的操作。
 * 该方法是 ES2018 引入标准的。
 * 
 * Promise.all()，方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。
 * const p = Promise.all([p1, p2, p3]);
 * 
 * p的状态由p1、p2、p3决定，分成两种情况。

（1）只有p1、p2、p3的状态都变成fulfilled，p的状态才会变成fulfilled，此时p1、p2、p3的返回值组成一个数组，传递给p的回调函数。

（2）只要p1、p2、p3之中有一个被rejected，p的状态就变成rejected，此时第一个被reject的实例的返回值，会传递给p的回调函数。

  * Promise.race()，同样是将多个 Promise 实例，包装成一个新的 Promise 实例。
 */